package com.example.gw_back_end.service.mongodb;

import com.example.gw_back_end.domain.document.CartDocument;
import com.example.gw_back_end.domain.entities.Game;
import com.example.gw_back_end.repository.CartRepository;
import com.example.gw_back_end.service.GameService;
import com.example.gw_back_end.utils.ThreadLocalUtil;
import org.springframework.stereotype.Service;

import java.util.*;

@Service
public class CartService {

    private final CartRepository cartRepository;
    private final GameService gameService;
    public CartService(CartRepository cartRepository, GameService gameService) {
        this.cartRepository = cartRepository;
        this.gameService = gameService;
    }

    /**
     * 保存或更新购物车
     * @param gameId 购物车对象
     * @return 保存后的购物车对象
     */
    public CartDocument saveShoppingCart(Integer gameId) {
        // 获取当前用户 ID
        Map<String, Object> claims = ThreadLocalUtil.get();
        Object userId = claims.get("id");

        // 查询购物车
        Optional<CartDocument> optionalCart = cartRepository.findById(userId.toString());
        CartDocument cart;

        if (optionalCart.isPresent()) {
            cart = optionalCart.get();
        } else {
            cart = new CartDocument();
            cart.setUserId(userId.toString());
            cart.setItems(new ArrayList<>()); // 初始化空列表
        }

        // 检查商品是否已经存在于购物车中
        boolean found = false;
        for (CartDocument.CartItem item : cart.getItems()) {
            if (item.getGameId().equals(gameId)) {
                item.setQuantity(item.getQuantity() + 1); // 数量+1
                found = true;
                break;
            }
        }

        // 如果没有找到该商品，添加新条目
        if (!found) {
            CartDocument.CartItem newItem = new CartDocument.CartItem();
            newItem.setGameId(gameId.toString());
            newItem.setQuantity(1);
            cart.getItems().add(newItem);
        }

        // 保存并返回
        return cartRepository.save(cart);
    }


    /**
     * 获取用户购物车
     * userId 用户ID
     * @return 购物车对象
     */
    public CartDocument getShoppingCart() {
        Map<String, Object> claims = ThreadLocalUtil.get();
        String userId = claims.get("id").toString();

        Optional<CartDocument> optionalCart = cartRepository.findById(userId);
        if (optionalCart.isEmpty()) {
            return null;
        }

        CartDocument cart = optionalCart.get();
        List<CartDocument.CartItem> items = cart.getItems();
        if (items == null || items.isEmpty()) {
            return cart;
        }

        // 收集所有游戏ID
        List<Integer> gameIds = items.stream()
                .map(item -> Integer.valueOf(item.getGameId()))
                .toList();

        // 批量查询所有游戏信息
        List<Game> games = gameService.listByIds(gameIds);

        // 建立 id -> Game 的映射
        Map<Integer, Game> gameMap = new HashMap<>();
        for (Game game : games) {
            gameMap.put(game.getId(), game);
        }

        // 为每个 CartItem 填充 title 和 coverImage
        for (CartDocument.CartItem item : items) {
            Integer gameId = Integer.valueOf(item.getGameId());
            Game game = gameMap.get(gameId);
            if (game != null) {
                item.setGameId(game.getId().toString());
                item.setCoverImage(game.getCoverImage());
                item.setTitle(game.getTitle());
                item.setPrice(game.getPrice());
                item.setPriceD(game.getPriceD());
            }
        }

        return cart;
    }

    /**
     * 删除用户购物车
     * @param gameId 用户ID
     */
    public void deleteShoppingCart(String gameId) {
        // 获取当前用户 ID
        Map<String, Object> claims = ThreadLocalUtil.get();
        String userId = claims.get("id").toString();

        // 查询用户购物车
        Optional<CartDocument> optionalCart = cartRepository.findById(userId);
        if (optionalCart.isPresent()) {
            CartDocument cart = optionalCart.get();

            // 从 items 中移除指定游戏
            cart.getItems().removeIf(item -> item.getGameId().equals(gameId));

            // 保存更新后的购物车
            cartRepository.save(cart);
        }
    }

    /**
     * 清空用户购物车
     *  用户ID
     */
    public void clearShoppingCart() {
        // 获取当前用户 ID
        Map<String, Object> claims = ThreadLocalUtil.get();
        String userId = claims.get("id").toString();

        // 查找用户购物车
        Optional<CartDocument> optionalCart = cartRepository.findById(userId);
        if (optionalCart.isPresent()) {
            CartDocument cart = optionalCart.get();
            cart.getItems().clear(); // 清空购物车中的所有商品
            cartRepository.save(cart); // 保存更新
        }
    }

}
